/*
 * Charpente.cpp
 *
 *  Created on: 6 juin 2013
 *      Author: Toshiba
 */

#include <vector>
#include <string>
#include <algorithm>
#include <ostream>
#include <iostream>
#include <iomanip>
#include <sstream>

#include "Charpente.h"
#include "Classe.h"


using namespace std;
Charpente::Charpente() :
		listeClasse() {
}

Charpente::Charpente(const Charpente& charp): listeClasse(charp.listeClasse)
{

}

Charpente::~Charpente() {
}


Charpente& Charpente::operator = (const Charpente& source)
{
	listeClasse =vector<Classe*>(source.listeClasse);
	return(*this);
}
//Classe Charpente::add_classe(const Classe* cla, Classe hy) {
void Charpente::add_classe(Classe* cla) {
	//cla->setCharpente(this);
	//cout << " dedans" << endl;
	//c.afficher();
	//listeClasse.empty();
	//cout << listeClasse.size() << endl;

	//cout << "AAAAVVVVVVVAANNNTT" << endl;
	//if(hy!=NULL)


	//if(listeClasse.size() == 0)
		listeClasse.push_back(cla);


	//cout << "aprrrrrrrrrrreees" << endl;
	//hy.afficher();


	//cout << "La liste contient maintenant " << listeClasse.size() << endl;
	//c->afficher();
	//cout << "on sort" << endl << endl;
	//return(hy);
	//cout << "apres" << endl;
}

// Supprime la classe c mit en parametre
//FAUX UTILISER std::find POUR trouver l'iterateur

void Charpente::sup_classe(Classe* c) {
	std::vector<Classe*>::iterator it;
	it = find(listeClasse.begin(), listeClasse.end(), c);
	listeClasse.erase(it);

	/*int i;
	 for (i = 0; i < listeClasse.size(); ++i) {
	 if (listeClasse.at(i).equal(c)) {
	 break;
	 }
	 }
	 listeClasse.erase(listeClasse.begin() + i);*/
}

void Charpente::resoudre() {
	//cout << "Dans Charpente::resoudre" << endl;
	listeClasse.at(0)->resoudre();
}

int Charpente::verif_charpente() {
	for (unsigned int i = 0; i < listeClasse.size(); ++i) {
		if (listeClasse.at(i)->verif_class() != -1)
			return i;
	}
	return -1;
}

void Charpente::afficher() {

	//pour chaque ligne
	int size = get_classe(0)->get_vector().size();
	int save = size;
	int number;
	int size_col;
	int max_char;
	string tmp;

	max_char = get_classe(0)->get_vector().size();
	max_char *= 3;

	//pour chaque ligne
	for(unsigned int k=0; k<get_classe(0)->get_vector().size();k++)
	{
		cout << get_classe(0)->get_vector().at(k).at(0).at(0) << "  ";
		//pour chaque classe
		for (unsigned int i = 0; i < listeClasse.size(); i++)
		{
			size = save;
			tmp = "[";
			size_col = get_classe(i)->get_vector().at(k).at(1).size();
			max_char -= size_col;
			for(int j =0; j < size_col; j++)
			{
				std::ostringstream oss;
				number = get_classe(i)->get_vector().at(k).at(1).at(j);
				oss << number;
				tmp = tmp + oss.str();
				if(j != (size_col-1))
				{
					tmp +=", ";
				}
			}
			tmp += "]";
			size_col = get_classe(i)->get_vector().at(k).at(2).size();
			if(size_col>0)
			{
				tmp += "[";
				for(int j =0; j < size_col; j++)
				{
					std::ostringstream oss;
					number = get_classe(i)->get_vector().at(k).at(2).at(j);
					oss << number;
					tmp = tmp + oss.str();
					if(j != (size_col-1))
					{
						tmp +=", ";
					}
				}
				tmp += "]";
			}



			cout.width(21);
			cout << std::left << tmp;
		}
		cout << endl;
	}
}

Classe* Charpente::get_classe(int i)
{
	return(listeClasse.at(i));
}

vector<Classe*>& Charpente::getListeClasse() {
	return listeClasse;
}

void Charpente::setListeClasse(const vector<Classe*>& listeClasse) {
	this->listeClasse = listeClasse;
}


int Charpente::calcul_polynome()
{
	int total = 0;
	int tmp = 0;
	int couleur = 6;

	//pour toutes les classes
	for(unsigned int i = 0; i < listeClasse.size(); i++)
	{
		//pour tous les sommets
		tmp = 1 ;
		for(unsigned int j =0; j < listeClasse.at(i)->get_vector().size(); j++)
		{
			//s'il y a un premier etage
			if(listeClasse.at(i)->get_vector().at(j).at(1).size() > 0)
			{
				//si premiere valeur > 0
				if(listeClasse.at(i)->get_vector().at(j).at(1).at(0) > 0)
				{
					tmp *= couleur - listeClasse.at(i)->get_vector().at(j).at(1).size();
				}
			}
			else
			{
				tmp *= couleur;
			}

		}
		//cout << tmp << " + ";
		total += tmp;
	}
	return (total);
}

int Charpente::getSize()
{
	return(listeClasse.size());
}


/*ostream& operator<<(ostream &o, Charpente& c) {
 for (unsigned i = 0; i < c.getListeClasse().size(); i++) {
 cout << c.getListeClasse().at(i)
 }
 }*/

